2  Work-up for Hypereosinophilia

2.1 Key Definitions

  • Eosinophilia is defined as an absolute eosinophil count >0.5 × 109/L in the peripheral blood.
Show the code
definitions <- tibble(
  Term = c("Eosinophilia", 
           "Hypereosinophilia (HE)", 
           "Hypereosinophilic Syndrome (HES)",
           "Primary (Neoplastic) HE",
           "Secondary (Reactive) HE"),
  Definition = c("Absolute eosinophil count >0.5 × 10^9/L",
                 "Persistent eosinophil count ≥1.5 × 10^9/L on 2 examinations",
                 "HE with organ damage attributable to eosinophilia",
                 "Clonal/neoplastic eosinophilia",
                 "Non-clonal eosinophilia due to underlying condition"),
  `Clinical Significance` = c("Requires evaluation",
                              "May indicate serious underlying condition",
                              "Requires urgent intervention",
                              "Associated with tyrosine kinase gene fusions",
                              "Associated with allergies, infections, malignancies")
)

definitions %>%
  kable(caption = "Key Definitions in Eosinophilia") %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed")) %>%
  column_spec(1, bold = TRUE, width = "20%") %>%
  column_spec(2, width = "40%") %>%
  column_spec(3, width = "40%")
Key Definitions in Eosinophilia
Term Definition Clinical Significance
Eosinophilia Absolute eosinophil count >0.5 × 10^9/L Requires evaluation
Hypereosinophilia (HE) Persistent eosinophil count ≥1.5 × 10^9/L on 2 examinations May indicate serious underlying condition
Hypereosinophilic Syndrome (HES) HE with organ damage attributable to eosinophilia Requires urgent intervention
Primary (Neoplastic) HE Clonal/neoplastic eosinophilia Associated with tyrosine kinase gene fusions
Secondary (Reactive) HE Non-clonal eosinophilia due to underlying condition Associated with allergies, infections, malignancies

2.2 Initial Evaluation Flowchart

2.3 Causes of Secondary (Reactive) Eosinophilia

Show the code
secondary_causes <- tibble(
  Category = c(rep("Infections", 4),
               rep("Allergic/Hypersensitivity", 3),
               rep("Medications", 3),
               rep("Malignancies", 3),
               rep("Other Conditions", 3)),
  Examples = c(
    # Infections
    "Parasitic (Strongyloides, Toxocara, Trichinella)",
    "Viral (HIV, HSV, HTLV-2)",
    "Fungal (Coccidioides, Histoplasma)",
    "Bacterial/Mycobacterial",
    # Allergic
    "Asthma, Allergic rhinitis",
    "Atopic dermatitis, Eczema",
    "Drug reactions, DRESS syndrome",
    # Medications
    "Aspirin, NSAIDs",
    "Antimicrobials",
    "Antiepileptics",
    # Malignancies
    "Solid tumors (lung, breast, GI)",
    "Hodgkin lymphoma",
    "T-cell lymphomas",
    # Other
    "Adrenal insufficiency",
    "Autoimmune diseases",
    "Graft-versus-host disease"
  )
)

secondary_causes %>%
  group_by(Category) %>%
  summarise(Examples = paste(Examples, collapse = "; ")) %>%
  kable(caption = "Common Causes of Secondary Eosinophilia") %>%
  kable_styling(bootstrap_options = c("striped", "hover")) %>%
  column_spec(1, bold = TRUE, width = "30%") %>%
  column_spec(2, width = "70%")
Common Causes of Secondary Eosinophilia
Category Examples
Allergic/Hypersensitivity Asthma, Allergic rhinitis; Atopic dermatitis, Eczema; Drug reactions, DRESS syndrome
Infections Parasitic (Strongyloides, Toxocara, Trichinella); Viral (HIV, HSV, HTLV-2); Fungal (Coccidioides, Histoplasma); Bacterial/Mycobacterial
Malignancies Solid tumors (lung, breast, GI); Hodgkin lymphoma; T-cell lymphomas
Medications Aspirin, NSAIDs; Antimicrobials; Antiepileptics
Other Conditions Adrenal insufficiency; Autoimmune diseases; Graft-versus-host disease

2.4 Diagnostic Workup for Primary Eosinophilia

2.4.1 General Diagnostic Studies

Show the code
workup_tests <- tibble(
  `Test Category` = c(
    "Hematologic",
    "Hematologic",
    "Hematologic",
    "Biochemical",
    "Biochemical",
    "Immunologic",
    "Immunologic",
    "Bone Marrow",
    "Bone Marrow",
    "Molecular/Cytogenetic",
    "Molecular/Cytogenetic"
  ),
  Test = c(
    "CBC with differential",
    "Peripheral blood smear",
    "Flow cytometry",
    "Comprehensive metabolic panel",
    "Serum tryptase",
    "Quantitative immunoglobulins",
    "T-cell immunophenotyping",
    "Bone marrow aspirate and biopsy",
    "Immunohistochemistry",
    "FISH for PDGFRA",
    "Myeloid mutation panel (NGS)"
  ),
  Purpose = c(
    "Quantify eosinophilia, assess other cell lines",
    "Evaluate for dysplasia, blasts, abnormal cells",
    "Detect abnormal T-cell populations",
    "Assess organ function",
    "Screen for mast cell disorders",
    "Evaluate for immunodeficiency",
    "Identify clonal T-cells",
    "Assess cellularity, fibrosis, mast cells",
    "CD117, CD25, CD30, tryptase staining",
    "Detect FIP1L1::PDGFRA fusion",
    "Identify clonal markers"
  )
)

workup_tests %>%
  datatable(
    caption = "Diagnostic Workup for Primary Eosinophilia",
    options = list(
      pageLength = 15,
      autoWidth = TRUE,
      columnDefs = list(
        list(width = '25%', targets = 0),
        list(width = '35%', targets = 1),
        list(width = '40%', targets = 2)
      )
    )
  )

2.4.2 Tyrosine Kinase Gene Fusion Testing Algorithm

Show the code
# Create comprehensive TK Fusion Testing Table
tk_fusion_table <- tibble(
  `Step` = c(1, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4),
  `Karyotype Result` = c(
    "Initial Testing",
    "Normal",
    "Abnormal",
    "Normal",
    "Normal",
    "Abnormal",
    "Abnormal",
    "Abnormal",
    "Abnormal",
    "Abnormal",
    "Any",
    "Any",
    "Any",
    "Any",
    "Any",
    "Any",
    "Any"
  ),
  `Test Performed` = c(
    "Karyotype Analysis",
    "→ FISH for PDGFRA",
    "→ Assess chromosomal breakpoints",
    "FISH for PDGFRA",
    "RT-qPCR for FIP1L1::PDGFRA",
    "FISH for PDGFRB",
    "FISH for FGFR1",
    "FISH for JAK2",
    "FISH for FLT3",
    "FISH for ABL1",
    "PDGFRA testing",
    "PDGFRB testing",
    "FGFR1 testing",
    "JAK2 testing",
    "FLT3 testing",
    "ABL1 testing",
    "RT-qPCR (if FISH negative)"
  ),
  `Chromosomal Location` = c(
    "All chromosomes",
    "4q12",
    "Multiple",
    "4q12",
    "4q12",
    "5q31-33",
    "8p11-12",
    "9p24",
    "13q12",
    "9q34",
    "4q12",
    "5q31-33",
    "8p11-12",
    "9p24",
    "13q12",
    "9q34",
    "4q12"
  ),
  `Result` = c(
    "Normal or Abnormal",
    "If negative → RT-qPCR",
    "Identify specific breakpoints",
    "Positive or Negative",
    "Positive or Negative",
    "Positive or Negative",
    "Positive or Negative",
    "Positive or Negative",
    "Positive or Negative",
    "Positive or Negative",
    "PDGFRA Rearrangement",
    "PDGFRB Rearrangement",
    "FGFR1 Rearrangement",
    "JAK2 Rearrangement",
    "FLT3 Rearrangement",
    "ABL1 Rearrangement",
    "FIP1L1::PDGFRA fusion"
  ),
  `Clinical Significance` = c(
    "Initial screening",
    "Most common TK fusion",
    "Guide targeted testing",
    "Cryptic deletion",
    "Most sensitive for FIP1L1",
    "CMML-like presentation",
    "Aggressive course",
    "Poor prognosis",
    "Variable course",
    "ALL/AML association",
    "Excellent imatinib response",
    "Good imatinib response",
    "Consider pemigatinib",
    "Consider ruxolitinib",
    "Consider FLT3 inhibitors",
    "Consider dasatinib/nilotinib",
    "Confirms diagnosis"
  ),
  `Next Action` = c(
    "Branch based on result",
    "Proceed to RT-qPCR",
    "Test specific genes",
    "If positive → Confirm",
    "If positive → Confirm",
    "If positive → Confirm",
    "If positive → Confirm",
    "If positive → Confirm",
    "If positive → Confirm",
    "If positive → Confirm",
    "Start treatment",
    "Start treatment",
    "Start treatment + HCT eval",
    "Start treatment + HCT eval",
    "Start treatment + HCT eval",
    "Start treatment",
    "Start treatment"
  )
)

# Display as comprehensive table
tk_fusion_table %>%
  gt() %>%
  tab_header(
    title = "Tyrosine Kinase Fusion Testing Algorithm",
    subtitle = "Systematic Approach Based on Karyotype Results"
  ) %>%
  tab_style(
    style = list(
      cell_fill(color = "#90EE90"),
      cell_text(weight = "bold")
    ),
    locations = cells_body(rows = Step == 1)
  ) %>%
  tab_style(
    style = cell_fill(color = "#FFFFE0"),
    locations = cells_body(rows = Step == 2)
  ) %>%
  tab_style(
    style = cell_fill(color = "#E0E0FF"),
    locations = cells_body(rows = Step == 3)
  ) %>%
  tab_style(
    style = cell_fill(color = "#90EE90"),
    locations = cells_body(rows = Step == 4)
  ) %>%
  tab_footnote(
    footnote = "FISH = Fluorescence in situ hybridization; RT-qPCR = Quantitative reverse transcriptase PCR",
    locations = cells_column_labels(columns = `Test Performed`)
  ) %>%
  tab_footnote(
    footnote = "HCT = Hematopoietic cell transplant",
    locations = cells_column_labels(columns = `Next Action`)
  )
Tyrosine Kinase Fusion Testing Algorithm
Systematic Approach Based on Karyotype Results
Step Karyotype Result Test Performed1 Chromosomal Location Result Clinical Significance Next Action2
1 Initial Testing Karyotype Analysis All chromosomes Normal or Abnormal Initial screening Branch based on result
2 Normal → FISH for PDGFRA 4q12 If negative → RT-qPCR Most common TK fusion Proceed to RT-qPCR
2 Abnormal → Assess chromosomal breakpoints Multiple Identify specific breakpoints Guide targeted testing Test specific genes
3 Normal FISH for PDGFRA 4q12 Positive or Negative Cryptic deletion If positive → Confirm
3 Normal RT-qPCR for FIP1L1::PDGFRA 4q12 Positive or Negative Most sensitive for FIP1L1 If positive → Confirm
3 Abnormal FISH for PDGFRB 5q31-33 Positive or Negative CMML-like presentation If positive → Confirm
3 Abnormal FISH for FGFR1 8p11-12 Positive or Negative Aggressive course If positive → Confirm
3 Abnormal FISH for JAK2 9p24 Positive or Negative Poor prognosis If positive → Confirm
3 Abnormal FISH for FLT3 13q12 Positive or Negative Variable course If positive → Confirm
3 Abnormal FISH for ABL1 9q34 Positive or Negative ALL/AML association If positive → Confirm
4 Any PDGFRA testing 4q12 PDGFRA Rearrangement Excellent imatinib response Start treatment
4 Any PDGFRB testing 5q31-33 PDGFRB Rearrangement Good imatinib response Start treatment
4 Any FGFR1 testing 8p11-12 FGFR1 Rearrangement Consider pemigatinib Start treatment + HCT eval
4 Any JAK2 testing 9p24 JAK2 Rearrangement Consider ruxolitinib Start treatment + HCT eval
4 Any FLT3 testing 13q12 FLT3 Rearrangement Consider FLT3 inhibitors Start treatment + HCT eval
4 Any ABL1 testing 9q34 ABL1 Rearrangement Consider dasatinib/nilotinib Start treatment
4 Any RT-qPCR (if FISH negative) 4q12 FIP1L1::PDGFRA fusion Confirms diagnosis Start treatment
1 FISH = Fluorescence in situ hybridization; RT-qPCR = Quantitative reverse transcriptase PCR
2 HCT = Hematopoietic cell transplant
Show the code
# Alternative: Simplified Decision Table
tk_decision_table <- tibble(
  `Initial Karyotype` = c(
    "NORMAL KARYOTYPE",
    "",
    "",
    "",
    "ABNORMAL KARYOTYPE",
    "",
    "",
    "",
    ""
  ),
  `Gene/Location` = c(
    "PDGFRA (4q12)",
    "↓",
    "If FISH negative:",
    "",
    "PDGFRB (5q31-33)",
    "FGFR1 (8p11-12)",
    "JAK2 (9p24)",
    "FLT3 (13q12)",
    "ABL1 (9q34)"
  ),
  `Testing Approach` = c(
    "1. FISH for PDGFRA",
    "2. If negative → RT-qPCR",
    "RT-qPCR for FIP1L1::PDGFRA",
    "",
    "FISH for PDGFRB",
    "FISH for FGFR1",
    "FISH for JAK2",
    "FISH for FLT3",
    "FISH for ABL1"
  ),
  `Common Fusion` = c(
    "FIP1L1::PDGFRA",
    "",
    "",
    "",
    "ETV6::PDGFRB",
    "ZMYM2::FGFR1",
    "PCM1::JAK2",
    "ETV6::FLT3",
    "ETV6::ABL1"
  ),
  `Clinical Features` = c(
    "↑ Tryptase, male predominance",
    "",
    "",
    "",
    "CMML-like presentation",
    "Aggressive, T-cell lymphoma",
    "Poor prognosis",
    "Variable course",
    "ALL/AML association"
  ),
  `Treatment` = c(
    "Imatinib 100mg daily",
    "",
    "",
    "",
    "Imatinib 100-400mg daily",
    "Pemigatinib, early HCT",
    "Ruxolitinib, early HCT",
    "Gilteritinib, early HCT",
    "Dasatinib/Nilotinib"
  )
)

# Display simplified table
tk_decision_table %>%
  kable(caption = "TK Fusion Testing: Simplified Decision Guide") %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
                full_width = FALSE) %>%
  column_spec(1, bold = TRUE, width = "20%") %>%
  column_spec(2, width = "15%") %>%
  column_spec(3, width = "20%") %>%
  column_spec(4, width = "15%") %>%
  column_spec(5, width = "20%") %>%
  column_spec(6, width = "20%") %>%
  row_spec(1, background = "#FFE6E6", bold = TRUE) %>%
  row_spec(5, background = "#E6E6FF", bold = TRUE) %>%
  pack_rows("Normal Karyotype Pathway", 1, 4, label_row_css = "background-color: #FFE6E6; font-weight: bold;") %>%
  pack_rows("Abnormal Karyotype Pathway", 5, 9, label_row_css = "background-color: #E6E6FF; font-weight: bold;")
TK Fusion Testing: Simplified Decision Guide
Initial Karyotype Gene/Location Testing Approach Common Fusion Clinical Features Treatment
Normal Karyotype Pathway
NORMAL KARYOTYPE PDGFRA (4q12) 1. FISH for PDGFRA FIP1L1::PDGFRA ↑ Tryptase, male predominance Imatinib 100mg daily
↓ 2. If negative → RT-qPCR
If FISH negative: RT-qPCR for FIP1L1::PDGFRA
Abnormal Karyotype Pathway
ABNORMAL KARYOTYPE PDGFRB (5q31-33) FISH for PDGFRB ETV6::PDGFRB CMML-like presentation Imatinib 100-400mg daily
FGFR1 (8p11-12) FISH for FGFR1 ZMYM2::FGFR1 Aggressive, T-cell lymphoma Pemigatinib, early HCT
JAK2 (9p24) FISH for JAK2 PCM1::JAK2 Poor prognosis Ruxolitinib, early HCT
FLT3 (13q12) FISH for FLT3 ETV6::FLT3 Variable course Gilteritinib, early HCT
ABL1 (9q34) FISH for ABL1 ETV6::ABL1 ALL/AML association Dasatinib/Nilotinib

2.5 Target Organ Evaluation

2.5.1 Organ-Specific Testing

Show the code
organ_tests <- tibble(
  `Organ System` = c(
    "Cardiac",
    "Cardiac",
    "Pulmonary",
    "Pulmonary",
    "Gastrointestinal",
    "Neurologic",
    "Skin",
    "General"
  ),
  `Clinical Indication` = c(
    "Chest pain, dyspnea",
    "Elevated troponin/BNP",
    "Cough, dyspnea",
    "Abnormal chest X-ray",
    "Abdominal pain, diarrhea",
    "Peripheral neuropathy",
    "Rash, urticaria",
    "Constitutional symptoms"
  ),
  `Recommended Testing` = c(
    "ECG, Troponin, NT-proBNP",
    "Echocardiogram, Cardiac MRI",
    "Pulmonary function tests",
    "CT chest, Bronchoscopy with BAL",
    "Endoscopy with biopsy",
    "EMG, Nerve biopsy",
    "Skin biopsy",
    "CT/MRI imaging"
  )
)

organ_tests %>%
  kable(caption = "Organ-Specific Evaluation in Eosinophilia") %>%
  kable_styling(bootstrap_options = c("striped", "hover")) %>%
  column_spec(1, bold = TRUE, width = "20%") %>%
  column_spec(2, width = "35%") %>%
  column_spec(3, width = "45%") %>%
  row_spec(c(1,2), background = "#ffe6e6") %>%  # Highlight cardiac
  row_spec(c(3,4), background = "#e6f3ff")      # Highlight pulmonary
Organ-Specific Evaluation in Eosinophilia
Organ System Clinical Indication Recommended Testing
Cardiac Chest pain, dyspnea ECG, Troponin, NT-proBNP
Cardiac Elevated troponin/BNP Echocardiogram, Cardiac MRI
Pulmonary Cough, dyspnea Pulmonary function tests
Pulmonary Abnormal chest X-ray CT chest, Bronchoscopy with BAL
Gastrointestinal Abdominal pain, diarrhea Endoscopy with biopsy
Neurologic Peripheral neuropathy EMG, Nerve biopsy
Skin Rash, urticaria Skin biopsy
General Constitutional symptoms CT/MRI imaging

2.6 Clinical Pearls

2.6.1 Key Diagnostic Considerations

Show the code
# Create a summary visualization
pearls_data <- tibble(
  Category = c("Urgent Evaluation", "FIP1L1::PDGFRA", "PDGFRB", "FGFR1", "JAK2"),
  `Key Features` = c(
    "Cardiac involvement, thrombosis",
    "Male predominance, ↑ tryptase, mast cells",
    "CMML-like presentation",
    "Aggressive course, lymphadenopathy",
    "Poor prognosis, rapid progression"
  ),
  `Response to Imatinib` = c(NA, "Excellent", "Excellent", "Poor", "Poor"),
  Frequency = c(NA, 40, 25, 20, 10)  # Approximate percentages
)

# Create a bubble chart for gene fusion frequencies
plot_ly(
  pearls_data %>% filter(!is.na(Frequency)),
  x = ~Category,
  y = ~Frequency,
  size = ~Frequency,
  color = ~`Response to Imatinib`,
  colors = c("Excellent" = "green", "Poor" = "red"),
  type = 'scatter',
  mode = 'markers',
  marker = list(sizemode = 'diameter', sizeref = 2),
  text = ~paste("Gene:", Category, 
                "<br>Frequency:", Frequency, "%",
                "<br>Imatinib Response:", `Response to Imatinib`)
) %>%
  layout(
    title = "Tyrosine Kinase Gene Fusions in Eosinophilia",
    xaxis = list(title = "Gene Fusion"),
    yaxis = list(title = "Approximate Frequency (%)")
  )

2.6.2 Treatment Algorithm Summary

Show the code
treatment_summary <- tibble(
  `Gene Fusion` = c("FIP1L1::PDGFRA", "PDGFRB", "FGFR1", "JAK2", "FLT3", "ABL1"),
  `First-Line Treatment` = c(
    "Imatinib 100mg daily",
    "Imatinib 100-400mg daily",
    "Pemigatinib or clinical trial",
    "Ruxolitinib or clinical trial",
    "Gilteritinib or clinical trial",
    "Dasatinib or Nilotinib"
  ),
  `Consider HCT` = c("Rarely", "If resistant", "Early referral", 
                     "Early referral", "Early referral", "Early referral"),
  Prognosis = c("Excellent", "Good", "Poor", "Poor", "Variable", "Variable")
)

treatment_summary %>%
  kable(caption = "Treatment Summary by Gene Fusion") %>%
  kable_styling(bootstrap_options = c("striped", "hover")) %>%
  column_spec(1, bold = TRUE) %>%
  column_spec(4, color = case_when(
    treatment_summary$Prognosis == "Excellent" ~ "green",
    treatment_summary$Prognosis == "Good" ~ "blue",
    treatment_summary$Prognosis == "Poor" ~ "red",
    TRUE ~ "black"
  ))
Treatment Summary by Gene Fusion
Gene Fusion First-Line Treatment Consider HCT Prognosis
FIP1L1::PDGFRA Imatinib 100mg daily Rarely Excellent
PDGFRB Imatinib 100-400mg daily If resistant Good
FGFR1 Pemigatinib or clinical trial Early referral Poor
JAK2 Ruxolitinib or clinical trial Early referral Poor
FLT3 Gilteritinib or clinical trial Early referral Variable
ABL1 Dasatinib or Nilotinib Early referral Variable

2.6.3 Interactive Workup Checklist

Show the code
# Create an interactive checklist
checklist_items <- c(
  "Rule out secondary causes of eosinophilia",
  "Assess for urgent cardiac/thrombotic complications",
  "Complete blood count with differential",
  "Peripheral blood smear review",
  "Serum tryptase level",
  "Quantitative immunoglobulins including IgE",
  "T-cell immunophenotyping if indicated",
  "Bone marrow aspirate and biopsy",
  "FISH for PDGFRA (or RT-PCR for FIP1L1::PDGFRA)",
  "Karyotype analysis",
  "Additional FISH based on karyotype results",
  "Myeloid mutation panel (NGS) if available",
  "Organ-specific evaluation as indicated"
)

checklist_df <- tibble(
  Step = 1:length(checklist_items),
  Task = checklist_items,
  Priority = c(rep("High", 2), rep("Essential", 8), rep("Additional", 3))
)

checklist_df %>%
  datatable(
    caption = "Eosinophilia Workup Checklist",
    options = list(
      pageLength = 15,
      dom = 'Bfrtip',
      buttons = c('copy', 'csv', 'excel', 'pdf', 'print')
    ),
    extensions = 'Buttons'
  ) %>%
  formatStyle(
    'Priority',
    backgroundColor = styleEqual(
      c("High", "Essential", "Additional"),
      c("#ff9999", "#ffcc99", "#ccccff")
    )
  )

2.7 Patient Note

  • Patient referred for absolute eosinophil count of >0.5 × 109/L.

  • Review of systems notable forpresence/absence of B symptoms, rash, cardiac/pulmonary symptoms].

  • Medication review completed with particular attention to drug-induced eosinophilia. Primary workup by referring team appropriately included parasitic evaluation and basic inflammatory markers.

  • Further hematologic evaluation initiated with peripheral blood flow showed eosinophilia, serum tryptase, vitamin B12 level, and FISH panel for FIP1L1-PDGFRA, BCR-ABL1, and myeloid NGS panel

  • Flow cytometry ordered to evaluate for aberrant T-cell populations.

  • If idiopathic hypereosinophilic syndrome suspected, will assess for end-organ damage with urinalysis, LFTs, and consideration of tissue biopsy.

  • Bone marrow biopsy to be performed if peripheral studies non-diagnostic or concerning for myeloid/lymphoid neoplasm with eosinophilia.